package panaderialabaguette;
import java.sql.*;
/**
 *
 * @author Espinoza-Moreno
 *
 */
public class Conexion {

    //Para establecer la conexion necesito un objeto Connection
    private Connection conexion = null;

    public void estableceConexion()
    {
        if ( this.getConexion() != null )
            return;

        /* En esta línea especifico la url de la base de datos con la que
         * vamos a trabajar, como es una base en postgres se escribe
         * Jdbc:postgresql://
         * como la base de datos se encuentra en la maquina escribimos
         * localhost, y a continuacion la direccion del puerto utilizado
         * localhost:5432 (puerto por defecto en postgres)
         * a continuacion se especifica el nombre de la base de datos con la
         * que se va a trabajar, en este caso "panaderia_la_baguette"
         */

        String url = "Jdbc:postgresql://localhost:5432/panaderia_la_baguette";
        try
        {
           /* En esta linea se establece el driver que se va a utilizar para
            * trabajar con la base, como trabajamos en postgres escribimos
            * "org.postgresql.Driver"
            */
           Class.forName("org.postgresql.Driver");
           //Establecemos el Usuario y la contraseña
           //Usuario= postgres
           //Contraseña= martin
           //Estos datos los especificamos durante la instalacion de postgres
           //y durante la creación de la base.
           this.setConexion(DriverManager.getConnection(url,"postgres","fede"));
           if ( this.getConexion() != null ){
               System.out.println("Conexión a base de datos ... Ok");
           }
        } catch (Exception e) {
            System.out.println("Problema al establecer la Conexión a la base de datos");
        }
    }


    public String obtenerID( String id, String tabla ) throws Exception{
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT max("+id+") FROM " + tabla);
            rs.next();
            if (rs.getString(1) == null)
            {
                return "0";
            }
            else
                return rs.getString(1);
        }
        catch (Exception e)
        {
            throw e;
        }       
    }

    /**
     * Devuelve los elementos de la tabla seleccida, oredenados de acuerdo al criterio establecido en orden
     * @param nombreTabla el nombre de la tabla que queremos obtener de la base de datos
     * @param orden campo de la tabla a partir del cual se van a ordenadar los elmentos
     * @return
     * @throws Exception
     */
    public ResultSet obtenerTuplaOrdenada ( String nombreTabla,String orden ) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT * FROM "+nombreTabla+" ORDER BY "+orden+" ");
        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }


	  /**
     * Permite obtener los elementos de la tabla solicitada de una base de datos, a partir de un criterio de búsqueda y ordenados a partir del
     * criterio indicadao en orden
     *
     * @param nombreTabla
     * @param filtro el campo de la tabla a partir del cual se quieren obtener los elementos
     * @param orden campo a partir del cual se quiere obtener los elementos oordenados.
     * @param campo valor del campo filtro
     * @return
     * @throws Exception
     */
    public ResultSet obtenerTupla (String nombreTabla,String filtro, String orden, Integer campo) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT * FROM "+nombreTabla+" WHERE ("+filtro+" IS "+campo+") ORDER BY "+orden+" ");
        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }

	/**
     * Permite obtener los elementos de la tabla solicitada de una base de datos, a partir de un criterio de búsqueda,
     * el cual es especificado en filtro, ordenados a partir de lo especificado en orden
     *
     * @param nombreTabla nombre de la tabla que se quiere obtener de la base de datos
     * @param filtro permite establecer un criterio de búsqueda de los elementos de la tabla
     * @param campo
     * @param orden elemento a partir del cual se quiere obtener los campos ordenados
     * @return
     * @throws Exception
     */
    public ResultSet obtenerTupla (String nombreTabla,String filtro, String campo,String orden) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT * FROM "+nombreTabla+" WHERE ("+filtro+" = '"+campo+"') ORDER BY "+orden+" ");

        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }


    public ResultSet obtenerTupla(String tabla,String nombre) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;

        try
        {
            s = this.getConexion().createStatement();
            rs = s.executeQuery("SELECT * FROM "+tabla+" WHERE nombre ILIKE '"+nombre+"%' ORDER BY nombre");
            return rs;
        }
        catch (Exception e)
        {
            throw e;
        }
    }

   
    public ResultSet obtenerTupla (String nombreTabla,String filtro, String campo) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT * FROM "+nombreTabla+" WHERE ("+filtro+" = '"+campo+"') ORDER BY nombre");

        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }


    public ResultSet obtenerTupla (String nombreTabla,String filtro, Integer campo) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT * FROM "+nombreTabla+" WHERE ("+filtro+" = "+campo+")");
        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }



    public ResultSet obtenerTupla (Integer campo) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT P.id_producto, P.nombre, P.descripcion, D.cantidad, D.precio FROM producto P, detalle_ticket D WHERE P.id_producto = D.id_producto AND D.nro_ticket = "+campo+" ");
        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }

    public ResultSet obtenerVolumen(java.sql.Date fecha1, java.sql.Date fecha2) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("select P.id_producto, P.nombre, P.descripcion,P.unidad,sum(D.cantidad),sum(D.precio*D.cantidad) from producto P, detalle_ticket D, ticket T where D.id_producto = P.id_producto and T.nro_ticket = D.nro_ticket and T.fecha between '"+fecha1+"' and '"+fecha2+"' group by P.id_producto, P.nombre, P.descripcion, P.precio, P.unidad, P.stock order by P.nombre ");
        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }


    public ResultSet obtenerTupla ( String nombreTabla ) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT * FROM " + nombreTabla);
        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }

    public ResultSet obtenerTupla ( String nombreTabla, String campo, Integer valor, String otroCampo, String otroValor ) throws Exception
    {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT * FROM " + nombreTabla + " WHERE " +campo+ " = " +valor+ " AND " +otroCampo+ " = '" +otroValor+ "'" );
        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }



    //crear un empleado nuevo en la base de datos
    public void crearRegistro(int id_empleado,String nombre,String contraseña,String tipo_empleado,String calle, String numero, String depto, String piso, String telefono) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("INSERT INTO empleado values ("+id_empleado+",'"+nombre+"','"+contraseña+"','"+tipo_empleado+"','"+calle+"',"+numero+",'"+depto+"',"+piso+",'"+telefono+"')");
        }catch (Exception e)
        {
            throw e;
        }
    }

    //crea un nuevo empleado en la base de datos
    public void crearRegistro(int id_empleado,String nombre,String contraseña,String tipo_empleado,String calle, String numero, String telefono) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("INSERT INTO empleado (dni, nombre_usuario, contrasenia, funcion,calle,numero,telefono) VALUES  ("+id_empleado+",'"+nombre+"','"+contraseña+"','"+tipo_empleado+"','"+calle+"',"+numero+",'"+telefono+"')");
        }catch (Exception e)
        {
            throw e;
        }
    }

    //crea el registro del cliente
    /**
     *
     * @param id_cliente
     * @param nombre
     * @param titular
     * @param dni
     * @param cuit
     * @param calle
     * @param nro
     * @param depto
     * @param piso
     * @param localidad
     * @param email
     * @param telefono
     * @throws Exception
     */
    public void crearRegistro(int id_cliente, String nombre,String dni, String calle, String nro,String depto, String piso, String telefono) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("INSERT INTO cliente VALUES ("+id_cliente+",'"+nombre+"','',"+dni+",'','"+calle+"',"+nro+",'"+depto+"',"+piso+",'','','"+telefono+"')");
        }catch (Exception e)
        {
            throw e;
        }
    }


    /**
     * Crea un nuevo cliente en la base de datos
     *
     * @param id_cliente
     * @param nombre
     * @param titular
     * @param dni
     * @param cuit
     * @param calle
     * @param nro
     * @param depto
     * @param piso
     * @param localidad
     * @param email
     * @param telefono
     * @throws Exception
     */

      public void crearRegistro(int id_cliente, String nombre,String titular,String cuit, String calle, String nro,String depto, String piso,String localidad,String email, String telefono) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("INSERT INTO cliente VALUES ("+id_cliente+",'"+nombre+"','"+titular+"',null,'"+cuit+"','"+calle+"',"+nro+",'"+depto+"',"+piso+",'"+localidad+"','"+email+"','"+telefono+"')");
        }catch (Exception e)
        {
            throw e;
        }
    }

    /**
     * Crea un nuevo producto en la base de datos
     *
     * @param id_producto
     * @param nombre
     * @param descripcion
     * @param precioUnitario
     * @param unidad
     * @param stock
     * @throws Exception
     */
    public void crearRegistro(int id_producto,String nombre,String descripcion,String precioUnitario, String unidad, String stock) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("INSERT INTO producto VALUES ("+id_producto+",'"+nombre+"','"+descripcion+"',"+precioUnitario+",'"+unidad+"',"+stock+")");
        }catch (Exception e)
        {
            throw e;
        }

    }

    //crea un nuevo ticket en la base de datos
    public void crearRegistro(java.sql.Time hora, java.sql.Date fecha) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("INSERT INTO ticket (hora,fecha) VALUES ('"+hora+"','"+fecha+"')");           
        }
        catch (Exception e)
        {
            throw e;
        }

    }

    
    //crea un nuevo detalle de ticket en la base de datos
    public void crearRegistro(int renglon, int num_ticket, int id_producto, int cantidad, float precio)throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("INSERT INTO detalle_ticket VALUES ("+renglon+","+num_ticket+","+id_producto+","+cantidad+","+precio+")");
        }catch (Exception e)
        {
            throw e;
        }
    }
    
   
     //poner a cero el contador de id de ticket
     //ALTER sequence ticket_nro_ticket_seq restart WITH 1;
     //crear un nuevo ticket

    public void eliminarRegistro(String tabla,String filtro,int identificador)
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("DELETE FROM "+tabla+" WHERE "+filtro+" = '"+identificador+"'");
        }catch (Exception e)
        {
            System.out.println("Problema al intentar eliminar " + e);
        }
    }


    /**
     *  Modifica los datos del empleado
     *
     *
     * @param dni
     * @param nombre_usuario
     * @param tipo_usuario
     * @param calle
     * @param numero
     * @param depto
     * @param piso
     * @param telefono
     * @throws Exception
     */
    public void modificarRegistro (int dni,String nombre_usuario,String tipo_usuario,String calle,String numero,String depto,String piso,String telefono) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("UPDATE empleado SET nombre_usuario = '"+nombre_usuario+"', funcion = '"+tipo_usuario+"', calle = '"+calle+"', numero = "+numero+", depto = '"+depto+"', piso = "+piso+", telefono = '"+telefono+"' WHERE dni = "+dni+" ");
        }catch (Exception e)
        {
            throw e;
        }
    }

    public void modificarRegistro (int dni,String nombre_usuario,String tipo_usuario,String calle,String numero,String telefono) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("UPDATE empleado SET nombre_usuario = '"+nombre_usuario+"', funcion = '"+tipo_usuario+"', calle = '"+calle+"', numero = "+numero+", telefono = '"+telefono+"' WHERE dni = "+dni+" ");
        }catch (Exception e)
        {
            throw e;
        }
    }


    /**
     * Anula un ticket, poniendo en verdadero el campo anulado en la tabla ticket 
     * @param nro_ticket
     * @throws Exception
     */
    public void modificarRegistro( int nro_ticket ) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute(" UPDATE ticket SET anulado = 'TRUE' WHERE nro_ticket = '"+nro_ticket+"' ");
        }catch (Exception e)
        {
            throw e;
        }
    }


    //acutaliza el stock de un producto
    public void modificarRegistro (int id_producto, String cantidad) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("UPDATE producto SET stock = stock - "+cantidad+" WHERE id_producto = "+id_producto);
        }catch (Exception e)
        {
            throw e;
        }

    }

    public void modificarRegistroProducto (int id_producto,String nombre,String descripcion,String precio, String unidad, String stock) throws Exception
    {
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            s.execute("UPDATE producto SET nombre = '"+nombre+"', descripcion = '"+descripcion+"', precio = "+precio+", unidad = '"+unidad+"', stock = "+stock+" WHERE id_producto = "+id_producto);
        }catch (Exception e)
        {
            throw e;
        }

    }

        
    public void cierraConexion()
    {
        try
        {
            this.getConexion().close();
        }catch(Exception e)
        {
            System.out.println("Problema para cerrar la Conexión a la base de datos ");
        }
    }

    public ResultSet obtenerTuplaLogin(String nombre_usuario, String contrasenia) throws Exception {
        ResultSet rs = null;
        Statement s = null;
        try
        {
            s = this.getConexion().createStatement();
            //seleccionamos la tabla de la base de datos la cual lleva por nombre localidad
            rs = s.executeQuery("SELECT * FROM empleado WHERE (nombre_usuario ='"+nombre_usuario+"' AND contrasenia = '"+contrasenia+"')");

        }
        catch (Exception e)
        {
            throw e;
        }

        return rs;
    }

    public Connection getConexion() {
        return conexion;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }



}
